AWS SAM
AWS Lambda とサーバレス開発フレームワーク
AWS Lambda を中心に据えたサーバーレス開発用のフレームワークは、有名どころとして以下がある。 Serverless Framework
AWS SAM
前者は OSS、後者は AWS が公式にサポートしている。
AWS SAM とは
サンプルプロジェクト
サンプルプロジェクトがいくつか公開されている。例えば、Java のサンプルプロジェクトは以下にある。
Swagger との連携
拡張が用意されている。
バージョニング
デプロイ節でも説明するが、エイリアスとバージョンの発行を有効にすることができる。
デプロイ
Gradual Code Deployment
AWS SAM は、CodeDeploy を利用したデプロイをサポートしている。これは以下をしてくれる。
新しいバージョンの作成と、それを指すエイリアスの作成
新しいバージョンが期待通りに動いていることを確認できるまで、ユーザのトラフィックを徐々に動かしていく
新しくデプロイしたコードが正しく動作するか検証するために、pre-traffic および post-traffic を定義できる
CloudWatch alarm がトリガーされたら、デプロイをロールバックする
つまりどういうことができる?
通常、Lambda をデプロイする際は、コードをアプロードして終わりで、何か問題があれば以前のコードをあげなおすことでロールバックする。あるいは、エイリアスを利用して、問題があればエイリアスだけ前のバージョンを指すようにもどしてロールバックする。
AWS SAM では、以前はバージョニングに関する機能がなく、コードをあげ直してロールバックするしかなかった。が、CodeDeploy を利用することで、むしろより高機能になった。
AWS Lambda の CloudWatch メトリクス には、一定時間内の Lambda のエラー発生率がある。AWS SAM を利用すると、 以前の関数から最新の関数へトラフィックを徐々に移行していき、エラー発生率が閾値を超えたら、デプロイを中止して巻き戻す といったことができるようになる。とても便利。 また、デプロイの前後に Lambda 関数を実行することもできる。ここで E2E テストを試してからデプロイ、みたいなこともできる!
設定方法
code:yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
MyFunction:
Type: AWS::Serverless::Function
Properties:
AutoPublishAlias: live
DeploymentPreference:
Type: Canary10Percent10Minutes
Alarms:
# A list of alarms that you want to monitor
- !Ref AliasErrorMetricGreaterThanZeroAlarm
- !Ref LatestVersionErrorMetricGreaterThanZeroAlarm
Hooks:
# Validation Lambda functions that are run before & after traffic shifting
PreTraffic: !Ref PreTrafficLambdaFunction
PostTraffic: !Ref PostTrafficLambdaFunction
設定項目は以下
AutoPublishAlias: <エイリアス名>
以下を実施する
Amazon S3 URI の変更から、コードの変更を検知する
新しいバージョンを作成する
エイリアスが存在しなければエイリアスを作成し、エイリアスを最新バージョンに向ける
他のイベントソースがエイリアスを指していなければ、この機能は意味がない
Type: <タイプ名>
デプロイタイプ。大きく以下の三種類
Canary:
Y分毎にXパーセントずつ新しいLambda関数へトラフィックを流し、100%になるまでこれを継続する
Linear:
XパーセントのトラフィックをY分間新しいLambda関数へ流し、その後一気に100パーセントのトラフィックを流す
All-at-once: 一気に全てのトラフィックを切り替える
Alarms: <CloudWatch Alarm の ARN>
デプロイ時にモニタリングするアラーム。アラートが出たらロールバックする
Hooks: <Lambda 関数の ARN>
事前/事後に実施する Lambda 関数